package keggacces;

import java.io.IOException;
import java.util.List;
import kegg.Entry;
import kegg.Pathway;
import kegg.Relation;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

/**
 * @file ParserKGML.java
 * @author Juan Humanes Ferrer
 * @date 04-Marzo-2014
 * @description Clase utilizada para el parseo de los xml de manera remota todos
 * los ficheros
 */
public class ParserKGML {

    /**
     * Método que parsea de manera remota el kgml indicado devolviendo un
     * Pathway con la informacion necesaria para realizar una comparacion con
     * otra red
     *
     * @param archivo
     * @return p
     * @throws IOException
     */
    public static Pathway parseoXML(String archivo) throws IOException {

        Pathway p = new Pathway();

        Document doc;

        doc = Jsoup.connect("http://rest.kegg.jp/get/" + archivo + "/kgml").timeout(10 * 1000).get();

        Elements pathways = doc.select("pathway");
        for (Element pathway : pathways) {
            //Parseo de un pathway

            Elements relaciones = pathway.getElementsByTag("relation");
            if (!relaciones.isEmpty()) {
                String titulo = pathway.attr("title");
                if (titulo.contains("/")) {
                    String[] a = titulo.split("/");
                    titulo = a[0];
                }
                if (titulo.contains(",")) {
                    String[] a = titulo.split(",");
                    titulo = a[0];
                }
                p.setTitle(titulo);
                p.setOrg(pathway.attr("org"));
                Elements entrys = pathway.getElementsByTag("entry");

                for (Element entry : entrys) {
                    Entry e = new Entry();
                    e.setName(entry.attr("name"));
                    //Si es de tipo grupo, se crea una lista de componentes
                    if (entry.attr("type").equals("group")) {
                        Elements components = entry.children();
                        e.addComponent(components.get(1).attr("id"));
                        e.addComponent(components.get(2).attr("id"));
                    }
                    e.setType(entry.attr("type"));
                    e.setId(entry.attr("id"));
                    p.addEntrada(e);
                }

                //Parseo de entradas
                for (Element relacion : relaciones) {
                    Elements components = relacion.children();
                    Relation r = new Relation();
                    if (!components.isEmpty()) {
                        r.setType(components.get(0).attr("name"));
                    } else {
                        r.setType("standard");
                    }
                    String id1 = relacion.attr("entry1");
                    String id2 = relacion.attr("entry2");

                    //Se guardan las dos entradas relacionadas
                    List<Entry> ListaEntradas = p.getEntradas();
                    for (Entry entrada : ListaEntradas) {
                        if (id1.equals(entrada.getId())) {
                            r.setEntrada1(entrada);
                        }
                        if (id2.equals(entrada.getId())) {
                            r.setEntrada2(entrada);
                        }
                    }

                    p.addRelacion(r);
                }
                p.red_Genes();

            }

        }
        return p;
    }

    /**
     * Método que parsea de manera remota el kgml indicado devolviendo un
     * Pathway con la informacion necesaria para realizar un analisis de
     * enriquecimiento
     *
     * @param archivo
     * @return p
     * @throws IOException
     */
    public static Pathway parseoXMLEnrich(String archivo) throws IOException {

        Pathway p = new Pathway();

        Document doc;

        doc = Jsoup.connect("http://rest.kegg.jp/get/" + archivo + "/kgml").timeout(10 * 1000).get();

        Elements pathways = doc.select("pathway");
        for (Element pathway : pathways) {
            //Parseo de un pathway

            Elements entradas = pathway.getElementsByTag("entry");
            if (!entradas.isEmpty()) {
                String titulo = pathway.attr("title");
                if (titulo.contains("/")) {
                    String[] a = titulo.split("/");
                    titulo = a[0];
                }
                if (titulo.contains(",")) {
                    String[] a = titulo.split(",");
                    titulo = a[0];
                }
                p.setTitle(titulo);
                p.setOrg(pathway.attr("org"));

                for (Element entry : entradas) {
                    Entry e = new Entry();
                    e.setName(entry.attr("name"));
                    //Si es de tipo grupo, se crea una lista de componentes
                    if (entry.attr("type").equals("group")) {
                        Elements components = entry.children();
                        e.addComponent(components.get(1).attr("id"));
                        e.addComponent(components.get(2).attr("id"));
                    }
                    e.setType(entry.attr("type"));
                    e.setId(entry.attr("id"));
                    p.addEntrada(e);
                }

            }

        }
        return p;
    }

}
